#!/bin/bash
# 数据库恢复脚本
# author    : guyadong
# date      : 2019/08/20

sh_folder="$(dirname $(readlink -f $0))"

# 脚本初始化
. "$sh_folder/constant"
[ ! -f "$sh_folder/status" ] && "没有找到 status文件，不能执行备份" && exit 255
. "$sh_folder/status"

# 显示命令行参数说明
usage() {
    echo "facelog 数据库恢复脚本"
    echo "从指定的文件夹恢复facelog，fdevmgr服务的数据库"
    echo "分别生成名为 facelog_bak.sql,fdevmgr_bak.sql的备份文件"
    echo "用法:"
    echo "  ./restore_db.sh [OPTION]...[FOLDER]"
    echo "FOLDER: 备份文件保存的文件夹，默认为当前路径下的./bak 文件夹"
    echo "参数说明:"
    echo "    -t --time yyyy-MM-dd-HH-MM-SS 备份数据库文件的时间戳(  格式)，不指定默认恢复最近日期的备份"
    echo "    -r --restart 恢复数据库后是否重新启动facelog/fdevmgr服务(默认不重启)"
    echo "    --facelog 只恢复 facelog 服务的数据库,不指定默认恢复所有服务数据库"
    echo "    --fdevmgr 只恢复 fdevmgr 服务的数据库,不指定默认恢复所有服务数据库"
    echo "    -h --help 输出帮助信息"
    exit 255
}
# 文件名中解析出时间戳,没有找到匹配的文件则报错退出
# $1 文件名前缀
function parse_lastest_time(){
    [ -n "$1" ] || return 1
    # 获取
    local lastest="$(ls -l $bak_folder/$1_bak-????-??-??-??-??-??.sql 2>/dev/null|awk '{print $9}'|sort -r | sed '1!d')"
    [ -z "$lastest" ] && echo "没有 $1 备份数据" && exit 255
    local f=$(basename "$lastest")
    f=${f/$1_bak-/}
    echo ${f/.sql/}
}

bak_folder="./bak"
time_suffix=
task_list="facelog fdevmgr"
input_list=
need_restart_service=1

# 解析命令行参数
while [ $# -ge 1 ] ; do
    case "$1" in
        -t|--time) time_suffix=$2;shift 2;;
        -h|--help) usage;;
        -r|--restart)
            need_restart_service=0;
            shift 1;;
        --facelog)
            input_list="$input_list facelog";
            shift 1;;
        --fdevmgr)
            input_list="$input_list fdevmgr";
            shift 1;;
        *) 
            [ ! -d "$1" ] && echo "无效文件夹 $1." ; exit 255
            bak_folder="$1"
            shift 1;;
    esac
done

[ -n "$input_list"  ] && task_list="$input_list"


# 猜出时间戳参数
if [ -z "$time_suffix" ] 
then
    facelog_lastest=
    fdevmgr_lastest=
    [[ "$task_list" == *facelog* ]] && facelog_lastest=$(parse_lastest_time facelog)
    [[ "$task_list" == *fdevmgr* ]] && fdevmgr_lastest=$(parse_lastest_time fdevmgr)

    [ -n "$facelog_lastest" ] && [ -n "$fdevmgr_lastest" ] && [ "$facelog_lastest" != "$fdevmgr_lastest" ] && echo "没有指定时间参数" && usage    
    [ "$facelog_lastest" = "$fdevmgr_lastest" ] && time_suffix=$fdevmgr_lastest
    [ -n "$facelog_lastest" ] && time_suffix=$facelog_lastest
    [ -n "$fdevmgr_lastest" ] && time_suffix=$fdevmgr_lastest
fi

[ -z "$time_suffix" ] && echo "没有指定备份时间(--time)" && usage

FACELOG_BAK="$bak_folder/facelog_bak-$time_suffix.sql"
FDEVMGR_BAK="$bak_folder/fdevmgr_bak-$time_suffix.sql"

if [[ "$task_list" == *facelog* ]]
then
    if [ -f "$FACELOG_BAK" ]
    then 
        export MYSQL_PWD=$database_jdbc_password
        
        mysql -h$database_jdbc_host -P$database_jdbc_port -u$database_jdbc_username -D$database_jdbc_schema < "$FACELOG_BAK" || exit 255
        echo "$database_jdbc_schema 数据库恢复成功:$FACELOG_BAK"
        if [ $need_restart_service -eq 0 ] && systemctl is-active facelog >/dev/null
        then
            echo "重启 facelog 服务"
            sudo systemctl restart facelog || exit 255
        fi

    else
        [ -n "$input_list" ] && echo "指定的备份数据不存在: $FACELOG_BAK" && exit 255
    fi
fi

if [[ "$task_list" == *fdevmgr* ]]
then
    if [ -f "$FDEVMGR_BAK" ]
    then
        export MYSQL_PWD=$fdevmgr_db_password
        mysql -h$fdevmgr_db_host -P$fdevmgr_db_port -u$fdevmgr_db_username -D$fdevmgr_db_schema < "$FDEVMGR_BAK" || exit_on_error
        echo "$fdevmgr_db_schema 数据库恢复成功:$FDEVMGR_BAK"
        if [ $need_restart_service -eq 0 ] && systemctl is-active facelog >/dev/null
        then
            echo "重启 fdevmgr 服务"
            sudo systemctl restart fdevmgr || exit 255
        fi
    else
        [ -n "$input_list" ] && echo "指定的备份数据不存在: $FDEVMGR_BAK" && exit 255
    fi
fi

exit 0
